home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / stdio / RCS / fdopen.c,v < prev    next >
Text File  |  1991-12-02  |  6KB  |  271 lines

  1. head     1.5;
  2. branch   ;
  3. access   ;
  4. symbols  sprited:1.5.1;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.5
  10. date     88.10.01.10.18.08;  author ouster;  state Exp;
  11. branches 1.5.1.1;
  12. next     1.4;
  13.  
  14. 1.4
  15. date     88.07.25.13.12.49;  author ouster;  state Exp;
  16. branches ;
  17. next     1.3;
  18.  
  19. 1.3
  20. date     88.07.22.09.11.38;  author ouster;  state Exp;
  21. branches ;
  22. next     1.2;
  23.  
  24. 1.2
  25. date     88.07.20.18.12.17;  author ouster;  state Exp;
  26. branches ;
  27. next     1.1;
  28.  
  29. 1.1
  30. date     88.06.10.16.23.42;  author ouster;  state Exp;
  31. branches ;
  32. next     ;
  33.  
  34. 1.5.1.1
  35. date     91.12.02.19.55.49;  author kupfer;  state Exp;
  36. branches ;
  37. next     ;
  38.  
  39.  
  40. desc
  41. @@
  42.  
  43.  
  44. 1.5
  45. log
  46. @Seek to eof on mode "a" (for UNIX compatibility).
  47. @
  48. text
  49. @/* 
  50.  * fdopen.c --
  51.  *
  52.  *    Source code for the "fdopen" library procedure.
  53.  *
  54.  * Copyright 1988 Regents of the University of California
  55.  * Permission to use, copy, modify, and distribute this
  56.  * software and its documentation for any purpose and without
  57.  * fee is hereby granted, provided that the above copyright
  58.  * notice appear in all copies.  The University of California
  59.  * makes no representations about the suitability of this
  60.  * software for any purpose.  It is provided "as is" without
  61.  * express or implied warranty.
  62.  */
  63.  
  64. #ifndef lint
  65. static char rcsid[] = "$Header: fdopen.c,v 1.4 88/07/25 13:12:49 ouster Exp $ SPRITE (Berkeley)";
  66. #endif not lint
  67.  
  68. #include <stdio.h>
  69. #include <stdlib.h>
  70. #include "fileInt.h"
  71.  
  72. /*
  73.  *----------------------------------------------------------------------
  74.  *
  75.  * fdopen --
  76.  *
  77.  *    This procedure initializes a FILE structure for a file (or pipe
  78.  *    or similar OS-supplied thing) that has been opened or inherited
  79.  *    through some other mechanism.
  80.  *
  81.  * Results:
  82.  *    The return value may be used to perform buffered I/O on
  83.  *    streamID.  If streamID isn't valid, then NULL is returned.
  84.  *
  85.  * Side effects:
  86.  *    The internal list stdioFileStreams gets a new element.
  87.  *
  88.  * Implementation Warning:
  89.  *    To be compatible with BSD, this procedure must permit multiple
  90.  *    streams on the same file stream!  This seems like a very bad
  91.  *    idea for a seekable stream, but seems to get used for network
  92.  *    connection.
  93.  *
  94.  *----------------------------------------------------------------------
  95.  */
  96.  
  97. FILE *
  98. fdopen(streamID, access)
  99.     int streamID;        /* Index of a stream identifier, such as
  100.                  * returned by open.  */
  101.     char *access;        /* Indicates the type of access to be
  102.                  * made on streamID, just as in fopen.
  103.                  * Must match the permissions on streamID.  */
  104. {
  105.     register FILE *     stream;
  106.     int         read, write;
  107.  
  108.     if (streamID < 0) {
  109.     return NULL;
  110.     }
  111.  
  112.     /*
  113.      * If this is for stdin, stdout, or stderr, try to use the standard
  114.      * FILE, unless it's already in use.  Otherwise allocate a new
  115.      * FILE structure.
  116.      */
  117.  
  118.     if (streamID <= 2) {
  119.     if (streamID == 0) {
  120.         stream = stdin;
  121.     } else if (streamID == 1) {
  122.         stream = stdout;
  123.     } else if (streamID == 2) {
  124.         stream = stderr;
  125.     }
  126.     if (stream->flags == 0) {
  127.         goto gotStream;
  128.     }
  129.     }
  130.     stream = (FILE *) malloc(sizeof(FILE));
  131.     stream->nextPtr = stdioFileStreams;
  132.     stdioFileStreams = stream;
  133.  
  134.     gotStream:
  135.     read = write = 0;
  136.     if ((access[1] == '+') || ((access[1] == 'b') && (access[2] == '+'))) {
  137.     read = write = 1;
  138.     } else if (access[0]  == 'r') {
  139.     read = 1;
  140.     } else {
  141.     write = 1;
  142.     }
  143.  
  144.     /*
  145.      * Seek to the end of the file if we're in append mode (I'm not sure
  146.      * this should be necessary, but UNIX programs seem to depend on it).
  147.      */
  148.  
  149.     if (access[0] == 'a') {
  150.     (void) lseek(streamID, 0, 2);
  151.     }
  152.  
  153.     Stdio_Setup(stream, read, write, stdioTempBuffer, 0,
  154.         StdioFileReadProc, StdioFileWriteProc, StdioFileCloseProc,
  155.         (ClientData) streamID);
  156.     return(stream);
  157. }
  158. @
  159.  
  160.  
  161. 1.5.1.1
  162. log
  163. @Initial branch for Sprite server.
  164. @
  165. text
  166. @d17 1
  167. a17 1
  168. static char rcsid[] = "$Header: /sprite/src/lib/c/stdio/RCS/fdopen.c,v 1.5 88/10/01 10:18:08 ouster Exp $ SPRITE (Berkeley)";
  169. @
  170.  
  171.  
  172. 1.4
  173. log
  174. @Lint.
  175. @
  176. text
  177. @d17 1
  178. a17 1
  179. static char rcsid[] = "$Header: fdopen.c,v 1.3 88/07/22 09:11:38 ouster Exp $ SPRITE (Berkeley)";
  180. d94 9
  181. @
  182.  
  183.  
  184. 1.3
  185. log
  186. @Check for a bad stream identifier:  some UNIX procedures depend
  187. on this, apparently.
  188. @
  189. text
  190. @d17 1
  191. a17 1
  192. static char rcsid[] = "$Header: fdopen.c,v 1.2 88/07/20 18:12:17 ouster Exp $ SPRITE (Berkeley)";
  193. d20 2
  194. a21 1
  195. #include "stdio.h"
  196. @
  197.  
  198.  
  199. 1.2
  200. log
  201. @Change file streams so that fdopen can be called more than once
  202. for a given stream id, and get separate buffers.
  203. @
  204. text
  205. @d17 1
  206. a17 1
  207. static char rcsid[] = "$Header: fdopen.c,v 1.1 88/06/10 16:23:42 ouster Exp $ SPRITE (Berkeley)";
  208. d34 1
  209. a34 1
  210.  *    streamID.
  211. d58 4
  212. @
  213.  
  214.  
  215. 1.1
  216. log
  217. @Initial revision
  218. @
  219. text
  220. @d17 1
  221. a17 1
  222. static char rcsid[] = "$Header: atoi.c,v 1.1 88/04/28 17:20:23 ouster Exp $ SPRITE (Berkeley)";
  223. d37 1
  224. a37 1
  225.  *    The internal array stdioFileStreams is modified.
  226. d39 6
  227. d60 3
  228. a62 1
  229.      * If the array of file streams isn't large enough, make it larger.
  230. d65 7
  231. a71 8
  232.     while (streamID >= stdioNumFileStreams) {
  233.     FILE **newStreams;
  234.     int i;
  235.  
  236.     newStreams = (FILE **)
  237.         malloc((unsigned) 2*stdioNumFileStreams*sizeof(FILE *));
  238.     for (i = 0; i < stdioNumFileStreams; i++) {
  239.         newStreams[i] = stdioFileStreams[i];
  240. d73 2
  241. a74 2
  242.     for (i = stdioNumFileStreams; i < 2*stdioNumFileStreams; i++) {
  243.         newStreams[i] = NULL;
  244. a75 5
  245.     if (stdioNumFileStreams != INIT_NUM_STREAMS) {
  246.         free((char *) stdioFileStreams);
  247.     }
  248.     stdioFileStreams = newStreams;
  249.     stdioNumFileStreams *= 2;
  250. d77 3
  251. d81 1
  252. a81 17
  253.     /*
  254.      * If there's already a structure for this stream, then free up its
  255.      * buffer.  Otherwise, allocate new space.
  256.      */
  257.  
  258.     stream = stdioFileStreams[streamID];
  259.     if (stream != NULL) {
  260.     if ((stream->buffer != stdioTempBuffer)
  261.         && (stream->buffer != NULL)
  262.         && !(stream->flags & STDIO_NOT_OUR_BUF)) {
  263.         free((char *) stream->buffer);
  264.     }
  265.     } else {
  266.     stream = (FILE *) malloc(sizeof(FILE));
  267.     stdioFileStreams[streamID] = stream;
  268.     }
  269.  
  270. @
  271.